home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1994 November: Tool Chest / Dev.CD Nov 94.toast / Sample Code / Snippets / Sound / 2BufRecordSndPlay / 2BufRecordSndPlay.c next >
Encoding:
C/C++ Source or Header  |  1992-07-15  |  3.4 KB  |  159 lines  |  [TEXT/MPS ]

  1. #include    <Quickdraw.h>
  2. #include    <Windows.h>
  3. #include    <dialogs.h>
  4. #include    <OSEvents.h>
  5. #include    <Memory.h>
  6. #include    <Packages.h>
  7. #include    <Sound.h>
  8. #include    <SoundInput.h>
  9. #include    <OSUtils.h>
  10.  
  11. #define    TRUE            0xFF
  12. #define    FALSE            0
  13. #define buffSize        0x10000
  14.  
  15. typedef struct {
  16.     short        OnOff;
  17.     short         Level;
  18. } Level;
  19.  
  20.  
  21. pascal void MyRecComp (SPBPtr inParamPtr);
  22.  
  23. main()
  24. {
  25.     OSErr                err;
  26.     SPBPtr                RecordRec;
  27.     long                SoundRefNum;
  28.     Handle                Buffer, Buffer2;
  29.     SndChannelPtr        chan;
  30.     Level                myLevel;
  31.     short                headerlength, headerlength2, dummy;
  32.     Fixed                sampleRate;
  33.     
  34.     InitGraf(&qd.thePort);
  35.     FlushEvents(everyEvent, 0);
  36.     InitWindows();
  37.     InitDialogs(nil);
  38.     InitCursor();
  39.     
  40.     err = SPBOpenDevice ('', siWritePermission, &SoundRefNum);
  41.     if (err != noErr)
  42.         Debugger();
  43.         
  44.     myLevel.OnOff = 0;
  45.     myLevel.Level = 0;
  46.     err = SPBSetDeviceInfo (SoundRefNum,siPlayThruOnOff, (Ptr) &myLevel);
  47.     if (err != noErr)
  48.         Debugger();
  49.         
  50.     myLevel.OnOff = 0;
  51.     myLevel.Level = 0;
  52.     err = SPBSetDeviceInfo (SoundRefNum,siTwosComplementOnOff, (Ptr) &myLevel);
  53.     if (err != noErr)
  54.         Debugger();
  55.         
  56.     err = SPBGetDeviceInfo (SoundRefNum,siSampleRate, (Ptr) &sampleRate);
  57.     if (err != noErr)
  58.         Debugger();
  59.         
  60.     RecordRec = (SPBPtr) NewPtr(sizeof (SPB));
  61.     if (MemError() != noErr || RecordRec == nil)
  62.         Debugger();
  63.  
  64.     Buffer = NewHandle(buffSize);
  65.     if (MemError() != noErr || Buffer == nil)
  66.         Debugger();
  67.     HLock (Buffer);
  68.  
  69.     err = SetupSndHeader (Buffer, 1, sampleRate, 8, 'NONE', 0x3C, 0, &headerlength);
  70.     if (err != noErr)
  71.         Debugger();
  72.     err = SetupSndHeader (Buffer, 1, sampleRate, 8, 'NONE', 0x3C, buffSize - headerlength, &dummy);
  73.     if (err != noErr)
  74.         Debugger();
  75.  
  76.     Buffer2 = NewHandle(buffSize);
  77.     if (MemError() != noErr || Buffer2 == nil)
  78.         Debugger();
  79.     HLock (Buffer2);
  80.  
  81.     err = SetupSndHeader (Buffer2, 1, sampleRate, 8, 'NONE', 0x3C, 0, &headerlength2);
  82.     if (err != noErr)
  83.         Debugger();
  84.         
  85.     err = SetupSndHeader (Buffer2, 1, sampleRate, 8, 'NONE', 0x3C, buffSize - headerlength2, &dummy);
  86.     if (err != noErr)
  87.         Debugger();
  88.         
  89.     RecordRec->inRefNum = SoundRefNum;
  90.     RecordRec->count = 0;
  91.     RecordRec->milliseconds = 15000;
  92.     RecordRec->bufferLength = buffSize - headerlength;
  93.     RecordRec->bufferPtr = (Ptr) ((*Buffer) + headerlength);
  94.     RecordRec->completionRoutine = (ProcPtr) &MyRecComp;
  95.     RecordRec->interruptRoutine = nil;
  96.     RecordRec->userLong = 0;
  97.     RecordRec->error = 0;
  98.     RecordRec->unused1 = 0;
  99.  
  100.     chan = nil;
  101.     err = SndNewChannel (&chan, sampledSynth, 0, nil);
  102.     if (err != noErr)
  103.         Debugger();
  104.         
  105.     do {
  106.         err = SPBRecord (RecordRec, TRUE);
  107.         if (err != noErr)
  108.             Debugger();
  109.             
  110.         do {
  111.             } while (RecordRec->userLong == 0);
  112.         
  113.         if (RecordRec->userLong == 10) {
  114.             if (RecordRec->bufferPtr == (Ptr) ((*Buffer) + headerlength)) {
  115.                 RecordRec->bufferPtr = (Ptr) ((*Buffer2) + headerlength2);
  116.     
  117.                 err = SndPlay (chan, Buffer, TRUE);
  118.                 if (err != noErr)
  119.                     Debugger();
  120.                     
  121.                 }
  122.             else {
  123.                 RecordRec->bufferPtr = (Ptr) ((*Buffer) + headerlength);
  124.     
  125.                 err = SndPlay (chan, Buffer2, TRUE);
  126.                 if (err != noErr)
  127.                     Debugger();
  128.         
  129.                 }
  130.             RecordRec->userLong = 0;
  131.             } 
  132.         } while (RecordRec->userLong != 1);
  133.         
  134.     err = SndDisposeChannel (chan,FALSE);
  135.     if (err != noErr)
  136.         Debugger();
  137.  
  138.     SPBCloseDevice (SoundRefNum);
  139.         
  140.     HUnlock (Buffer);
  141.     HUnlock (Buffer2);
  142.     DisposeHandle (Buffer);
  143.     DisposeHandle (Buffer2);
  144.     DisposePtr ((Ptr) RecordRec);
  145. }
  146. /**********************************/
  147.  
  148. pascal void MyRecComp (SPBPtr inParamPtr)
  149. {
  150.     inParamPtr->userLong = 10;    
  151.     
  152.     if (Button())
  153.         inParamPtr->userLong = 1;    
  154.     
  155.     return;
  156. }
  157.  
  158. /**********************************/
  159.